home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / vol6n17.arc / QP-QUICK.ASM < prev    next >
Assembly Source File  |  1987-09-09  |  4KB  |  75 lines

  1. ;QPRINT.ASM - performs Quick Printing in the QuickBASIC
  2. ;Note: Assemble this with MASM (2.0 or later)
  3. ;Copyright 1987, Ziff Communications Co.
  4.  
  5. Code        Segment Byte Public 'Code'
  6.             Assume  CS:Code
  7.             Public  QPrint
  8.  
  9. QPrint      Proc    Far
  10.  
  11. Begin:      Push  BP            ;save registers for BASIC
  12.  
  13.             Mov   AH,3          ;specify BIOS service to read cursor position
  14.             Mov   BH,0          ;on text page zero
  15.             Int   10h           ;this service returns row/column in DH/DL
  16.  
  17.             Mov   AL,DH         ;put the current row number into AL
  18.             Mov   CL,160        ;multiply by 160 to get start address of row
  19.             Mul   CL            ;do the multiplication, answer ends up in AX
  20.             Mov   DH,0          ;clear DH for the Add below, we only want DL
  21.             Add   AX,DX         ;add the column once for the character byte
  22.             Add   AX,DX         ;and once more for the attribute byte
  23.             Mov   DI,AX         ;now DI holds starting address on the screen
  24.  
  25.             Xor   DX,DX         ;zero out DX to look at low memory using ES
  26.             Mov   ES,DX
  27.             Mov   BX,0B000h     ;assume the mono screen segment for now
  28.             Mov   AL,ES:[463h]  ;look at the video controller port address
  29.             Cmp   AL,0B4h       ;is it mono?
  30.             JZ    Get_Params    ;yes, skip over adding 800h to video segment
  31.             Add   BX,800h       ;no, adjust BX for a color monitor
  32.             Push  BX            ;and save it because the EGA test destroys BX
  33.  
  34.             Mov   AH,12h        ;specify EGA BIOS EGA special function service
  35.             Mov   BL,10h        ;request EGA info
  36.             Int   10h           ;call the BIOS
  37.             Cmp   BL,10h        ;if BL is still 10h, there's no EGA
  38.             JNZ   EGA           ;it is an EGA, skip ahead
  39.             Mov   DX,3DAh       ;not EGA, specify port to check for retrace
  40.  
  41. EGA:        Pop   BX            ;get the video segment again
  42.  
  43. Get_Params: Mov   BP,SP         ;get stack pointer so we can find variables
  44.             Mov   ES,BX         ;move whatever segment is correct into ES
  45.  
  46.             Mov   SI,[BP+06]    ;get the color that was passed
  47.             Mov   AH,[SI]       ;and put it into AH for screen writing below
  48.             Mov   SI,[BP+08]    ;put descriptor to X$ into SI
  49.             Mov   CX,[SI]       ;put Len(X$) into CX for loop counter
  50.             JCXZ  Exit          ;if CX is zero it's a null string, exit now
  51.             Mov   SI,[SI+02]    ;put address of first character in X$ into SI
  52.             Cld                 ;clear the direction flag to move data forward
  53.  
  54. Check_Mon:  Cmp   DL,0          ;are we on a mono or EGA system?
  55.             JZ    Mono          ;yes, skip over the retrace stuff
  56.  
  57. No_Retrace: In    AL,DX         ;get the video status byte from port number DX
  58.             Test  AL,1          ;test just the horizontal retrace bit
  59.             JNZ   No_Retrace    ;if doing a retrace, wait until it's not
  60.  
  61. Retrace:    In    AL,DX         ;get the status byte again
  62.             Test  AL,1          ;are we doing a retrace now?
  63.             JZ    Retrace       ;no, wait until we are
  64.  
  65. Mono:       Lodsb               ;get the character from X$ and increment SI
  66.             Stosw               ;store both the character and attribute
  67.             Loop  Check_Mon     ;loop until CX is zero
  68.  
  69. Exit:       Pop   BP            ;restore BP for BASIC
  70.             Ret   4             ;return skipping the passed parameters
  71.  
  72. QPrint      Endp
  73. Code        Ends
  74.             End   Begin
  75.